home *** CD-ROM | disk | FTP | other *** search
- #pragma msg 148 ignore push
- #pragma msg 149 ignore push
- #pragma msg 61 ignore push
- #include <string.h>
- #include <libraries/iffparse.h>
- #include <proto/iffparse.h>
- #include "libraries.h"
- #pragma msg 149 pop
- #pragma msg 61 pop
-
- /* Check if 0. If not, then die. */
- #define CHECK0(a) if (a) goto die
-
- /* Check if non-0. If not, then die. */
- #define CHECKN0(a) if (!(a)) goto die
-
- /* Check if greater than or equal to 0. If not, then die. */
- #define CHECKGE0(a) if ((a) < 0) goto die
-
- void TextToClip (char *s)
- {
- struct IFFHandle *iff;
-
- CHECKN0 (iff = AllocIFF ());
- CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
- InitIFFasClip (iff);
- CHECK0 (OpenIFF (iff, IFFF_WRITE));
-
- CHECKGE0 (PushChunk (iff, 'FTXT', 'FORM', IFFSIZE_UNKNOWN));
-
- CHECKGE0 (PushChunk (iff, 0, 'CHRS', IFFSIZE_UNKNOWN));
- CHECKGE0 (WriteChunkBytes (iff, s, strlen (s)));
- CHECKGE0 (PopChunk (iff));
-
- #if 0
- CHECKGE0 (PushChunk (iff, 0L, 'ANNO', IFFSIZE_UNKNOWN));
- CHECKGE0 (WriteChunkBytes (iff, "written by IGadSpell and iffparse", 33));
- CHECKGE0 (PopChunk (iff));
- #endif
-
- CHECKGE0 (PopChunk (iff));
-
- die:
- if (iff)
- {
- CloseIFF (iff);
- if (iff->iff_Stream)
- CloseClipboard ((struct ClipboardHandle *) iff->iff_Stream);
- FreeIFF (iff);
- }
- }
-
- int TextFromClip (char *buffer, int size)
- {
- struct IFFHandle *iff;
- int good_read = 0;
-
- CHECKN0 (iff = AllocIFF ());
- CHECKN0 (iff->iff_Stream = (ULONG) OpenClipboard (PRIMARY_CLIP));
- InitIFFasClip (iff);
- CHECK0 (OpenIFF (iff, IFFF_READ));
-
- for (;;)
- {
- switch (ParseIFF (iff, IFFPARSE_RAWSTEP))
- {
- case IFFERR_EOC:
- break;
- case IFFERR_EOF:
- goto die;
- case 0:
- {
- struct ContextNode *chunk = CurrentChunk (iff);
-
- if (chunk && chunk->cn_ID == 'CHRS' && chunk->cn_Type == 'FTXT')
- {
- int bytes_read = ReadChunkBytes (iff, buffer, size);
-
- if (chunk->cn_Size == bytes_read)
- good_read = 1;
- if (chunk->cn_Size > bytes_read)
- good_read = -1;
- if (!bytes_read && chunk->cn_Size)
- good_read = 0;
-
- buffer[bytes_read < size ? bytes_read : size - 1] = '\0';
-
- goto die;
- }
- break;
- }
- default:
- goto die;
- }
- }
-
- die:
- if (iff)
- {
- CloseIFF (iff);
- if (iff->iff_Stream)
- CloseClipboard ((struct ClipboardHandle *)iff->iff_Stream);
- FreeIFF (iff);
- }
-
- return good_read;
- }
-